package com.bi.service;

import com.bi.dto.WideTableDataQueryDTO;
import com.bi.vo.WideTableDataVO;

import java.util.List;
import java.util.Map;

/**
 * Elasticsearch服务接口
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
public interface ElasticsearchService {

    /**
     * 创建索引
     * 
     * @param indexName 索引名称
     * @param mapping 映射配置
     * @return 创建结果
     */
    boolean createIndex(String indexName, Map<String, Object> mapping);

    /**
     * 删除索引
     * 
     * @param indexName 索引名称
     * @return 删除结果
     */
    boolean deleteIndex(String indexName);

    /**
     * 检查索引是否存在
     * 
     * @param indexName 索引名称
     * @return 是否存在
     */
    boolean indexExists(String indexName);

    /**
     * 批量插入数据
     * 
     * @param indexName 索引名称
     * @param documents 文档列表
     * @return 插入结果
     */
    boolean bulkInsert(String indexName, List<Map<String, Object>> documents);

    /**
     * 更新索引映射
     * 
     * @param indexName 索引名称
     * @param mapping 新的映射配置
     * @return 更新结果
     */
    boolean updateMapping(String indexName, Map<String, Object> mapping);

    /**
     * 查询数据宽表数据
     * 
     * @param indexName 索引名称
     * @param queryDTO 查询条件
     * @return 查询结果
     */
    WideTableDataVO queryWideTableData(String indexName, WideTableDataQueryDTO queryDTO);

    /**
     * 聚合查询
     * 
     * @param indexName 索引名称
     * @param queryDTO 查询条件
     * @return 聚合结果
     */
    Map<String, Object> aggregateQuery(String indexName, WideTableDataQueryDTO queryDTO);

    /**
     * 获取字段统计信息
     * 
     * @param indexName 索引名称
     * @param fieldName 字段名称
     * @return 统计信息
     */
    WideTableDataVO.FieldStats getFieldStats(String indexName, String fieldName);

    /**
     * 获取索引文档总数
     * 
     * @param indexName 索引名称
     * @return 文档总数
     */
    long getDocumentCount(String indexName);

    /**
     * 删除数据
     * 
     * @param indexName 索引名称
     * @param query 删除条件
     * @return 删除结果
     */
    boolean deleteByQuery(String indexName, Map<String, Object> query);

    /**
     * 搜索建议
     * 
     * @param indexName 索引名称
     * @param field 字段名称
     * @param prefix 前缀
     * @param size 返回数量
     * @return 建议列表
     */
    List<String> suggest(String indexName, String field, String prefix, int size);

    /**
     * 导出数据
     * 
     * @param indexName 索引名称
     * @param queryDTO 查询条件
     * @param callback 数据处理回调
     */
    void exportData(String indexName, WideTableDataQueryDTO queryDTO, DataExportCallback callback);

    /**
     * 数据导出回调接口
     */
    @FunctionalInterface
    interface DataExportCallback {
        void process(List<Map<String, Object>> batch);
    }
}